package com.demo.controller;

import com.demo.base.Result;
import com.demo.entity.DroolsRule;
import com.demo.entity.Order;
import com.demo.service.IDroolsRuleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.IOException;
import java.util.Date;
import java.util.List;

/**
 * @Classname DroolsRuleController
 * @Description 规则加载测试
 * @Date 2023/11/23 12:04
 * @Created by Leo825
 */

@RequestMapping("/test")
@Controller
@Slf4j
public class DroolsRuleController {
    @Autowired
    private IDroolsRuleService droolRuleService;

    /**
     * 在生产上使用的时候，需要使用CommandLineRunner在启动的时候，将所有规则加载。
     */
    @ResponseBody
    @RequestMapping("/reload")
    public String reload() throws IOException {
        droolRuleService.reloadAllDroolsRule();
        return "ok";
    }

    /**
     * 在生产上使用的时候，需要使用CommandLineRunner在启动的时候，将所有规则加载。
     */
    @ResponseBody
    @RequestMapping("/add")
    public Result add() {
        DroolsRule rule = new DroolsRule();
        rule.setKieBaseName("my_rule");
        rule.setKiePackageName("rules");
        rule.setRuleContent("package rules\n" +
                "import com.demo.entity.Order\n" +
                "//规则4：100元以上, 加积分\n" +
                "rule \"score_4\"\n" +
                "when\n" +
                "    $s : Order(amount > 1000)\n" +
                "then\n" +
                "    $s.setScore(1000);\n" +
                "    System.out.println(\"消费1000元 以上 加1000积分 \");\n" +
                "end");
        rule.setCreateUserName("admin");
        rule.setCreateTime(new Date());
        rule.setUpdateTime(new Date());
        droolRuleService.addDroolsRule(rule);
        return new Result().ok("{}");
    }

    /**
     * 在生产上使用的时候，需要使用CommandLineRunner在启动的时候，将所有规则加载。
     */
    @ResponseBody
    @RequestMapping("/findAll")
    public Result findAll() {
        List<DroolsRule> droolsRuleList = droolRuleService.findAll();
        return new Result().ok(droolsRuleList);
    }

    /**
     * 在生产上使用的时候，需要使用CommandLineRunner在启动的时候，将所有规则加载。
     */
    @ResponseBody
    @RequestMapping("/testRule")
    public Result testRule() {
        // 测试数据
        Order order = new Order();
        order.setAmount(999);
        order.setScore(999);
        if (!droolRuleService.executeRules(3L, order)) {
            log.error("系统中不存在规则 ,请加载！！！");
        }
        return new Result().ok("{}");
    }
}
